// 费用计算模块 - 根据详细设计文档的订单费用计算规则

/**
 * 计算代拿费用
 * @param {Object} params - 费用计算参数
 * @param {Number} params.distance - 距离（米）
 * @param {String} params.packageSize - 包裹大小（small/medium/large）
 * @param {Number} params.packageWeight - 包裹重量（kg）
 * @param {Boolean} params.isUrgent - 是否加急
 * @param {String} params.timeSlot - 时间段（morning/afternoon/evening/night）
 * @returns {Object} 费用计算结果
 */
function calculateDeliveryFee(params) {
  const { distance, packageSize, packageWeight, isUrgent = false, timeSlot = 'normal' } = params;

  let baseFee = 0; // 基础费用
  let distanceFee = 0; // 距离附加费
  let sizeFee = 0; // 尺寸附加费
  let weightFee = 0; // 重量附加费
  let urgentFee = 0; // 加急费
  let timeSlotFee = 0; // 时段附加费
  let platformFee = 0; // 平台抽佣

  // 1. 基础费用：3元
  baseFee = 3.0;

  // 2. 距离附加费：每100米0.5元，不足100米按100米计算
  if (distance > 0) {
    const distanceKm = Math.ceil(distance / 100) * 100; // 向上取整到100米
    distanceFee = (distanceKm / 100) * 0.5;
  } else {
    // 如果没有距离信息，使用默认距离500米
    distanceFee = (500 / 100) * 0.5;
  }

  // 3. 包裹尺寸附加费
  switch (packageSize) {
    case 'small':
      sizeFee = 0;
      break;
    case 'medium':
      sizeFee = 1.0;
      break;
    case 'large':
      sizeFee = 2.0;
      break;
    default:
      sizeFee = 0;
  }

  // 4. 重量附加费：超过3kg，每1kg加1元
  if (packageWeight && packageWeight > 3) {
    weightFee = Math.ceil(packageWeight - 3) * 1.0;
  }

  // 5. 加急费：5元
  if (isUrgent) {
    urgentFee = 5.0;
  }

  // 6. 时段附加费
  switch (timeSlot) {
    case 'morning': // 早上（7:00-9:00）
      timeSlotFee = 1.0;
      break;
    case 'evening': // 晚上（18:00-22:00）
      timeSlotFee = 2.0;
      break;
    case 'night': // 夜间（22:00-次日7:00）
      timeSlotFee = 3.0;
      break;
    default:
      timeSlotFee = 0;
  }

  // 7. 计算总费用（建议费用）
  const suggestedFee = baseFee + distanceFee + sizeFee + weightFee + urgentFee + timeSlotFee;

  // 8. 平台抽佣：10%（最低0.5元）
  platformFee = Math.max(suggestedFee * 0.1, 0.5);

  // 9. 最终费用（用户实际支付金额）
  const finalFee = suggestedFee;

  // 10. 代拿员收益（扣除平台抽佣）
  const courierIncome = finalFee - platformFee;

  return {
    baseFee: parseFloat(baseFee.toFixed(2)),
    distanceFee: parseFloat(distanceFee.toFixed(2)),
    sizeFee: parseFloat(sizeFee.toFixed(2)),
    weightFee: parseFloat(weightFee.toFixed(2)),
    urgentFee: parseFloat(urgentFee.toFixed(2)),
    timeSlotFee: parseFloat(timeSlotFee.toFixed(2)),
    suggestedFee: parseFloat(suggestedFee.toFixed(2)),
    finalFee: parseFloat(finalFee.toFixed(2)),
    platformFee: parseFloat(platformFee.toFixed(2)),
    courierIncome: parseFloat(courierIncome.toFixed(2)),
    distance: distance || 500,
    breakdown: {
      base: baseFee,
      distance: distanceFee,
      size: sizeFee,
      weight: weightFee,
      urgent: urgentFee,
      timeSlot: timeSlotFee
    }
  };
}

/**
 * 获取当前时间段
 * @returns {String} 时间段标识
 */
function getCurrentTimeSlot() {
  const hour = new Date().getHours();
  if (hour >= 7 && hour < 9) {
    return 'morning';
  } else if (hour >= 18 && hour < 22) {
    return 'evening';
  } else if (hour >= 22 || hour < 7) {
    return 'night';
  } else {
    return 'normal';
  }
}

module.exports = {
  calculateDeliveryFee,
  getCurrentTimeSlot
};

